#include <QDebug>

#include "metronomo.h"
#include "matematicas.h"

Metronomo::Metronomo()
{
    tempo = 120;
    pulsosPorCompas = 4;
	activo = false;
	reproducirSonido = false;
	
	ultimoPulsoEjecutado = -1;

	sonido1 = new QSound("../sonidos/metronomo1.wav");
	sonido2 = new QSound("../sonidos/metronomo2.wav");
}

Metronomo::~Metronomo()
{
	delete sonido1;
	delete sonido2;
}

void Metronomo::arrancar()
{	
	actualizar();
    contadorTiempo.inicializar();
	activo = true;
	ultimoPulsoEjecutado = -1;
}

void Metronomo::parar()
{
    activo = false;
}

void Metronomo::actualizar()
{	
	milisegundosPorPulso = 60000 / tempo;
	milisegundosPorCompas = milisegundosPorPulso * pulsosPorCompas;
}

unsigned long long Metronomo::getMilisegundosDesdeInicio() 
{
	return activo ? contadorTiempo.getMilisegundosTranscurridos() : 0;

}

int Metronomo::getNumeroCompasActual()
{
    double msActual = contadorTiempo.getMilisegundosTranscurridos();
    return floor(msActual / milisegundosPorCompas);
}

double Metronomo::getProporcionCompletadoCompas()
{
	if (!activo) {
		return false;
	}
	double msActual = contadorTiempo.getMilisegundosTranscurridos();

	double numeroCompasActual = floor(msActual / milisegundosPorCompas);

	double resto = msActual - milisegundosPorCompas * numeroCompasActual;

	return resto / milisegundosPorCompas;
}

unsigned long long Metronomo::getMilisegundoInicioCompas()
{
	double msActual = contadorTiempo.getMilisegundosTranscurridos();

	int numeroCompasActual = getNumeroCompasActual();

	return numeroCompasActual * milisegundosPorCompas;
}

#define MILISEGUNDOS_ERROR 2

void Metronomo::comprobarSonido()
{
	if (!reproducirSonido) {
		return;
	}

	double msActual = contadorTiempo.getMilisegundosTranscurridos();

	int numeroPulsoCercano = floor(msActual / milisegundosPorPulso);

	if (numeroPulsoCercano <= ultimoPulsoEjecutado) {
		numeroPulsoCercano++;
	}

	if (numeroPulsoCercano <= ultimoPulsoEjecutado) {
		return;
	}

	if (fabs(numeroPulsoCercano * milisegundosPorPulso - msActual) > MILISEGUNDOS_ERROR) {
		return;
	}

	bool esInicioCompas = numeroPulsoCercano % pulsosPorCompas == 0;

	if (esInicioCompas) {
		sonido1->play();
	} else {
		sonido2->play();
	}
	ultimoPulsoEjecutado = numeroPulsoCercano;


}